import java.io.DataOutputStream;
import java.io.IOException;

import org.json.JSONObject;

/*
 * Слово в кодировке Юникод
 * Используется для хранения слова если слово не может быть преобразовано в 1251 без потери
 */
final class WordUnicode extends WordInterface {
    final public char[] value;

    WordUnicode(final String w) {
        value = w.toCharArray();
    }

    WordUnicode(final char[] v) {
        value = v;
    }

    public String toString() {
        return new String(value);
    }

    public int length() {
        return value.length;
    }

    /*
     * Сравнение в лексиграфическом порядке.
     * Для WordUnicode не используется, так как этот тип не используется в ключах дерева.
     * 
     * Используется в сортировке слов в паттерне поиска
     */
    public int compareTo(final WordInterface b) {
        if (b instanceof Space) {
            return 1;
        }
        if (b instanceof WordUnicode) {
            final int length = value.length;
            final char[] y = ((WordUnicode) b).value;
            int cmp;
            if ((cmp = Integer.compare(length, y.length)) != 0) {
                return cmp;
            }
            for (int i = 0; i < length; i++) {
                if ((cmp = Character.compare(value[i], y[i])) != 0) {
                    return cmp;
                }
            }
            return 0;
        }
        Word x = new Word(this);
        return x.compareTo((Word) b);
    }

    JSONObject toJSON() {
        JSONObject jo = new JSONObject();
        jo.put("U", toString());
        return jo;
    }

    void write(DataOutputStream dos) throws IOException {
        dos.writeByte(0x55);        // U
        dos.writeInt(value.length);
        for (char c : value)
            dos.writeChar(c);
    }
}